<p>According to the Java API documentation:</p>
<blockquote>
  <p>There are two ways to create a new thread of execution. One is to declare a class to be a subclass of Thread. This subclass should override the
  run method of class Thread. An instance of the subclass can then be allocated and started…​</p>
  <p>The other way to create a thread is to declare a class that implements the Runnable interface. That class then implements the run method. An
  instance of the class can then be allocated, passed as an argument when creating Thread, and started.</p>
</blockquote>
<p>By definition, extending the Thread class without overriding the <code>run</code> method doesn’t make sense, and implies that the contract of the
<code>Thread</code> class is not well understood.</p>
<h2>Noncompliant Code Example</h2>
<pre>
public class MyRunner extends Thread { // Noncompliant; run method not overridden

  public void doSometing() {...}
}
</pre>
<h2>Exceptions</h2>
<p>If <code>run()</code> is not overridden in a class extending <code>Thread</code>, it means that starting the thread will actually call
<code>Thread.run()</code>. However, <code>Thread.run()</code> does nothing if it has not been fed with a target <code>Runnable</code>. The rule
consequently ignore classes extending <code>Thread</code> if they are calling, in their constructors, the <code>super(...)</code> constructor with a
proper <code>Runnable</code> target.</p>
<pre>
class MyThread extends Thread { // Compliant - calling super constructor with a Runnable
  MyThread(Runnable target) {
    super(target); // calling super constructor with a Runnable, which will be used for when Thread.run() is executed
    // ...
  }
}
</pre>

